/*
 * Tactica.java
 *
 * Created on 16 de julio de 2006, 13:19
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package futbol.tacticas.concursantes.newTeam;

import futbol.Bola;
import futbol.Futbol;
import futbol.tacticas.Comando;
import futbol.tacticas.SituacionJugadores;
import futbol.tacticas.concursantes.Tactica;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.image.BufferedImage;
import java.util.Vector;


/**
 *
 * @author Administrador
 */
public abstract class CosaPersona implements Tactica {
    
	private static Logger 					log	= Logger.getLogger(CosaPersona.class);
	
	protected String		nombre = "Towodo";
	protected Personalitat 	alineacion[] = null;;
	protected Tecnico		tecnico;
	protected BufferedImage pizarraImage;
	protected Graphics2D 	pizarra;
	
	public CosaPersona()
	{
		startTacticaPersonalitats();
	}
	/**
	 * Aquest metode es el que s'ha de sobreescriure.
	 * Especifiqueu aque la vosta alineaci�.
	 * @return Personalitat[]
	 */
	public abstract Personalitat[] updateAlineacion(boolean alineacionInicial);
	public void startTacticaPersonalitats()
	{
		log.debug("startTacticaPersonalitats");
		
		// declarem un entrenador tecnic.
		tecnico = new Tecnico(this); // per defecte sense historial
		
		// demanem a l'entrenador la alineaci� amb que jugarem. //si encara no esta decidida ens tornar� la inicial.
		if(alineacion!=null)
			log.error("startTacticaPersonalitats: alineacion no es null!!");
		
		alineacion = getAlineacion();
	}
	public void resetTacticaPersonalitats()
	{
		int i;
		for( i=0; i<alineacion.length; i++)
		{
			alineacion[i] = null;
		}
		
		alineacion = null;
		
		tecnico = null;
		pizarraImage = null;
		pizarra = null;
	}
	public String getNombre()
	{
		return nombre;
	}
	public Personalitat[] getAlineacion(){
		
		//log.debug("getAlineacion() alineacion="+alineacion);
		
		if(alineacion==null)
		{
			//log.debug("entrando en updateAlineacion");
			return updateAlineacion(true);
		}
		
		return alineacion;
	}
	
	public Color getColor1()
	{
		return Color.YELLOW;
	}
	public Color getColor2()
	{
		return Color.BLACK;
	}
	public Color getColorNumero()
	{
		return Color.GREEN;
	}
	public int getFuerza(int n)
	{
		return alineacion[n].getFuerza();
	}
	public int getXInicial(int n)
	{
		return ( ( (int)alineacion[n].getXInicial() * 2 ) + 160 );
	}
	public int getYInicial(int n)
	{
		return (int)alineacion[n].getYInicial();
	}
	public Vector<Comando> getComandos(SituacionJugadores sj)
	{
		//if(tecnico.getRonda() < 10 || tecnico.getRonda() > 1790) log.debug("start: " + tecnico.getRonda());
		
		Vector<Comando> comandos = new Vector<Comando>();
		Vector<Comando> comandosPersonalidad;
		
		
		int i,j;
		
		// li pasem l'estat del partit a l'entrenador tecnic.
		// ell fara els calculs que toqui i en propocionara
		// dades ja calculades.
		tecnico.nuevaSituacionJugadores(sj);
		for( i=0; i<alineacion.length; i++)
		{			
			// actualitzem les dades de la personalitat.
			alineacion[i].actualitzarDades();
		}
		
		// demanem a cada personalitat quines comandes vol executar.
		for( i=0; i<alineacion.length; i++)
		{			
			// del jugador de torn agafem les comandes que vol executar
			comandosPersonalidad = alineacion[i].getComandos();	

			// pot ser que no retorni res. llavors sudem d'ell.
			if(comandosPersonalidad != null && comandosPersonalidad.size()>0)
			{
				// sino les afegim a la resta de comandes
				for(j=0; j < comandosPersonalidad.size(); j++)
					comandos.add( comandosPersonalidad.elementAt(j) );
			}
		}
		
		// Donem la posibilitat a l'entrenador de fer canvis.
		// Es a dir, donar una alineaci� diferents per a la seguent ronda.
		// Amb el false li diem que no es la alineaci� inicial
		alineacion 		= updateAlineacion(false);
		
		// Aqui es pot fer alguna palla mental amb les comandes (com treure duplicats)..
		// Segurament no valgui la pena
		//
		//	for(i=0; i<comandos.size(); i++)
		//		pim pam...
		if(tecnico.getRonda() < 10 || tecnico.getRonda() > 1790) log.debug("end: " + tecnico.getRonda());

		//log.debug("ronda: " + tecnico.getRonda());
		if(tecnico.getRonda() == 1799)
		{
			resetTacticaPersonalitats();
			startTacticaPersonalitats();
		}
			
		return comandos;
	}
	public Tecnico getTecnico() {
		return tecnico;
	}	
	
	public BufferedImage getPizarraImage(){
		return this.pizarraImage;
	}
	
	public Graphics2D getPizarra(){
		return this.pizarra;
	}
	
}
